/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package itc.com.co.beans;

import BussinesLogic.AfiliacionBL;
import BussinesLogic.AfiliadoBL;
import BussinesLogic.CategoriaBL;
import BussinesLogic.PlanBL;
import BussinesLogic.ServicioBL;
import BussinesLogic.newpackage.enums.PlanEnum;
import EntidadesCM.AfiliacionCM;
import EntidadesCM.AfiliadoCM;
import EntidadesCM.CuentaCM;
import controller.exceptions.PreexistingEntityException;
import itc.com.co.beans.utils.AfiliacionDataModel;
import itc.com.co.beans.utils.AfiliadoDataModel;
import itc.com.co.beans.utils.AfiliadoDataModelT;
import itc.com.co.beans.utils.CuentaDataModel;
import itc.com.co.beans.utils.FacesUtils;
import itc.com.co.beans.utils.SelectUtil;
import itc.com.co.beans.utils.Utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Date;
import java.util.logging.Level;
import oracle.sql.DATE;
import org.primefaces.event.CloseEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

/**
 *
 * @author Nas
 */
public class AfiliacionBean {

    private List<AfiliadoCM> afiliados = new ArrayList<AfiliadoCM>();
    private AfiliadoDataModel dataModel = new AfiliadoDataModel(afiliados);
    private AfiliacionCM selectedAfiliadoT = new AfiliacionCM();
    private AfiliadoCM selectedAfiliado = new AfiliadoCM();
    private List<AfiliacionCM> afiliaciones = new ArrayList<AfiliacionCM>();
    private AfiliacionDataModel dataModelAfils = new AfiliacionDataModel(afiliaciones);
    private AfiliacionCM selectedAfiliacion = new AfiliacionCM();
    private List<CuentaCM> cuentas = new ArrayList<CuentaCM>();
    private CuentaDataModel dataModelCuenta = new CuentaDataModel(cuentas);
    private CuentaCM selectedCuenta = new CuentaCM();
    private String nombreAfi = "";
    private String docIdenti = "";
    private PlanBL planBL = new PlanBL();
    private AfiliacionBL afiliacionBL = new AfiliacionBL();
    private CategoriaBL categoriaBL = new CategoriaBL();
    private ServicioBL servicioBL = new ServicioBL();
    private String idAfiliado;
    private String idPlan = "";
    private String idAfiliacion = "";
    private String idCategoria = "";
    private String idCuenta = "";
    private String nroFactura = "";
    private Date fechaIni = new Date();
    private Date fechaFin = new Date();
    private String idServicio;
    private Map<String, String> planes = new HashMap<String, String>();
    private Map<String, String> categorias = new HashMap<String, String>();
    private Map<String, String> servicios = new HashMap<String, String>();
    private User user = new User();
    private boolean verPnlAfil = false;
    private boolean verTblAfil = false;
    private boolean verTblAfils = false;
    private boolean verTblCuen = false;
    private boolean verBtbNewAfils = false;
    private boolean verPlanCatego = false;
    private static Logger logger = Logger.getLogger(UserWizard.class.getName());
    private Utils utils = new Utils();

    public AfiliacionBean() {

        try {
            planes = SelectUtil.buildPlanesItems(planBL.buscarAllPlan());
            categorias = SelectUtil.buildCategoriasItems(categoriaBL.buscarAllCategorias());
        } catch (Exception e) {
            FacesUtils.addSuccessMessage("Afiliacion Error " + e.getMessage());
        }
    }

    /**
     ********************************************************************************************************************
     * Actions
     * *******************************************************************************************************************
     */
    public void mostraNuevaAfils() {

        verTblAfil = false;
        verPnlAfil = true;
        verTblAfils = false;
        verTblCuen = false;
        verPlanCatego = true;
        fechaIni = new Date();
        fechaFin = new Date();
        idAfiliacion = "";
        idPlan = "";
        idCategoria = "";
        servicios = new HashMap<String, String>();
        nroFactura = "";
    }

    public void buscarAfiliado() {
        verTblAfil = false;
        verPnlAfil = false;
        verTblAfils = false;
        verTblCuen = false;
        verPlanCatego = false;
        AfiliadoBL afiliadoBL = new AfiliadoBL();
        afiliados = afiliadoBL.buscarAfiliadoByNombreCompletoAndDocIdenti(docIdenti, nombreAfi, "I");
        dataModel = new AfiliadoDataModel(afiliados);

        if (afiliados != null) {
            verTblAfil = true;
        } else {
            FacesMessage msg = new FacesMessage("Mensaje", "No se encontraron afiliados");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void displayLocation() {
        FacesMessage msg = new FacesMessage("Selected", "Categoria:" + idCategoria + ", servicio: " + idServicio);
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void guardarAfiliacion() {
        FacesMessage msg;
        if (selectedAfiliacion != null) {
        } else {
            selectedAfiliacion = new AfiliacionCM();
        }

        selectedAfiliacion.getIdPlan().setIdPlan(Integer.parseInt(idPlan));
        selectedAfiliacion.getIdAfiliado().setIdAfiliado(Integer.parseInt(idAfiliado));
        selectedAfiliacion.getIdCategoria().setIdCategoria(Integer.parseInt(idCategoria));
        selectedAfiliacion.setFechaIni(fechaIni);
        fechaFin = planBL.calcularFinPlan(fechaIni, Integer.parseInt(idPlan));
        selectedAfiliacion.setFechaFin(fechaFin);
        selectedAfiliacion.setNroFactura(nroFactura);
        if (Integer.parseInt(idPlan) == PlanEnum.CUOTAS.getValue()) {
            if (!idCuenta.equalsIgnoreCase("")) {
                selectedAfiliacion.setIdCuenta(Integer.parseInt(idCuenta));
            } else {
                msg = new FacesMessage("Mensaje", "Debe seleccionar una cuenta");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                return;
            }
        }
        try {
            if (selectedAfiliacion.getIdAfiliacion() > 0) {
                afiliacionBL.modificarAfiliacion(selectedAfiliacion);
            } else {
                afiliacionBL.crearAfiliacion(selectedAfiliacion);
            }
            limpiarForm();
            msg = new FacesMessage("Mensaje", "Operación exitosa");
            // FacesContext.getCurrentInstance().addMessage(null, msg);
        } catch (PreexistingEntityException ex) {
            msg = new FacesMessage("Mensaje", "Error al realizar la operación " + ex.getMessage());
            Logger.getLogger(AfiliacionBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            msg = new FacesMessage("Mensaje", "Error al realizar la operación " + ex.getMessage());
            Logger.getLogger(AfiliacionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void handlePlanChange() {
        System.out.println("id_plan: " + idPlan);
        if (idPlan != null) {
            cuentas = planBL.validarPlan(Integer.parseInt(idPlan), Integer.parseInt(idAfiliado));
            if (cuentas != null) {
                dataModelCuenta = new CuentaDataModel(cuentas);
                verTblCuen = true;
            } else {
                verTblCuen = false;
            }
        }
    }

    public void handleCategoriaChange() {
        System.out.println("id_categoria: " + idCategoria);
        if (idCategoria != null) {
            servicios = SelectUtil.buildServiciosItems(servicioBL.buscarAllServiciosByCategoria(Integer.parseInt(idCategoria)));
        } else {
            servicios = new HashMap<String, String>();
        }
    }

    /**
     ********************************************************************************************************************
     * Event Listners
     * *******************************************************************************************************************
     */
    public void onRowSelect(SelectEvent event) {
        verTblCuen = false;
        FacesMessage msg = new FacesMessage("AfiliadoSelected", ((AfiliadoCM) event.getObject()).getIdAfiliado().toString());
        selectedAfiliado = ((AfiliadoCM) event.getObject());
        idAfiliado = selectedAfiliado.getIdAfiliado().toString();
        selectedAfiliado.setAfiliacionList(afiliacionBL.buscarAfiliacionesByIdAfiliado(selectedAfiliado.getIdAfiliado()));
        afiliaciones = afiliacionBL.buscarAfiliacionesByIdAfiliado(selectedAfiliado.getIdAfiliado());
        //   idAfiliado = (((AfiliadoCM) event.getObject()).getIdAfiliado().toString());
        dataModelAfils = new AfiliacionDataModel(afiliaciones);
        verTblAfil = false;
        verPnlAfil = true;

        verBtbNewAfils = true;
        if (afiliaciones != null) {
            verTblAfils = true;
        } else {
            verTblAfils = false;
            msg = new FacesMessage("Mensaje", "No se encontraron afiliaciones");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        //FacesContext.getCurrentInstance().addMessage(null, msg);  
    }

    public void onRowUnselect(UnselectEvent event) {
        FacesMessage msg = new FacesMessage("Afiliado Unselected", ((AfiliadoCM) event.getObject()).getIdAfiliado().toString());

        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onRowSelectAfils(SelectEvent event) {
        FacesMessage msg = new FacesMessage("AfiliacionSelected", ((AfiliacionCM) event.getObject()).getIdAfiliacion().toString());
        selectedAfiliacion = ((AfiliacionCM) event.getObject());

        idAfiliacion = selectedAfiliacion.getIdAfiliacion().toString();
        idCategoria = selectedAfiliacion.getIdCategoria().getIdCategoria().toString();

        idPlan = selectedAfiliacion.getIdPlan().getIdPlan().toString();
        fechaIni = selectedAfiliacion.getFechaIni();
        fechaFin = selectedAfiliacion.getFechaFin();
        nroFactura = selectedAfiliacion.getNroFactura();

        if (idPlan != null) {
            cuentas = planBL.validarPlan(Integer.parseInt(idPlan), Integer.parseInt(idAfiliado));
            if (cuentas != null) {
                dataModelCuenta = new CuentaDataModel(cuentas);
                verTblCuen = true;
            } else {
                verTblCuen = false;
            }
        }

        if (selectedAfiliacion.getIdCuenta() > 0 && selectedAfiliacion.getIdCuenta() != 0) {
            idCuenta = selectedAfiliacion.getIdCuenta().toString();
            verTblCuen = true;
        }

        if (idCategoria != null) {
            servicios = SelectUtil.buildServiciosItems(servicioBL.buscarAllServiciosByCategoria(Integer.parseInt(idCategoria)));
        } else {
            servicios = new HashMap<String, String>();
        }


        verTblAfils = false;
        verPnlAfil = true;
        verPlanCatego = true;


    }

    public void onRowUnselectAfils(UnselectEvent event) {
        FacesMessage msg = new FacesMessage("Afiliado Unselected", ((AfiliadoCM) event.getObject()).getIdAfiliado().toString());

        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onRowSelectCuenta(SelectEvent event) {
        FacesMessage msg = new FacesMessage("CuentaSelected", ((CuentaCM) event.getObject()).getIdCuenta().toString());
        selectedCuenta = ((CuentaCM) event.getObject());
        idCuenta = ((CuentaCM) event.getObject()).getIdCuenta().toString();
    }

    public void onRowUnselectCuenta(UnselectEvent event) {
        FacesMessage msg = new FacesMessage("Cuenta Unselected", ((CuentaCM) event.getObject()).getIdCuenta().toString());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void handleClose(CloseEvent event) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                event.getComponent().getId() + " closed", "So you don't like nature?");
        selectedAfiliado.setAfiliacionList(afiliacionBL.buscarAfiliacionesByIdAfiliado(selectedAfiliado.getIdAfiliado()));
        afiliaciones = afiliacionBL.buscarAfiliacionesByIdAfiliado(selectedAfiliado.getIdAfiliado());
        //   idAfiliado = (((AfiliadoCM) event.getObject()).getIdAfiliado().toString());
        dataModelAfils = new AfiliacionDataModel(afiliaciones);
        verPnlAfil = false;
        verTblCuen = false;
        verTblAfils = false;
        verBtbNewAfils = false;
        verPlanCatego = false;
        try {
            facesContext.getExternalContext().redirect("./faces/menu.xhtml");
            facesContext.addMessage(null, message);
        } catch (IOException ex) {
            Logger.getLogger(AfiliacionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     ********************************************************************************************************************
     * Private Methods
     * *******************************************************************************************************************
     */
    private void limpiarForm() {
        selectedAfiliado.setAfiliacionList(afiliacionBL.buscarAfiliacionesByIdAfiliado(selectedAfiliado.getIdAfiliado()));
        afiliaciones = afiliacionBL.buscarAfiliacionesByIdAfiliado(selectedAfiliado.getIdAfiliado());
        //   idAfiliado = (((AfiliadoCM) event.getObject()).getIdAfiliado().toString());
        dataModelAfils = new AfiliacionDataModel(afiliaciones);
        verPnlAfil = false;
        verTblCuen = false;
        verTblAfils = true;
        verBtbNewAfils = true;
        verPlanCatego = false;
    }

    /**
     ********************************************************************************************************************
     * Getters And Setters
     * *******************************************************************************************************************
     */
    /**
     * @return the idPlan
     */
    public String getIdPlan() {
        return idPlan;
    }

    /**
     * @param idPlan the idPlan to set
     */
    public void setIdPlan(String idPlan) {
        this.idPlan = idPlan;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Map<String, String> getServicios() {
        return servicios;
    }

    public void setServicios(Map<String, String> servicios) {
        this.servicios = servicios;
    }

    public String getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(String idCategoria) {
        this.idCategoria = idCategoria;
    }

    public String getIdServicio() {
        return idServicio;
    }

    public void setIdServicio(String idServicio) {
        this.idServicio = idServicio;
    }

    public Map<String, String> getCategorias() {
        return categorias;
    }

    public void setCategorias(Map<String, String> categorias) {
        this.categorias = categorias;
    }

    public Date getFechaIni() {
        return fechaIni;
    }

    public void setFechaIni(Date fechaIni) {
        this.fechaIni = fechaIni;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public String getNombreAfi() {
        return nombreAfi;
    }

    public void setNombreAfi(String nombreAfi) {
        this.nombreAfi = nombreAfi;
    }

    public String getDocIdenti() {
        return docIdenti;
    }

    public void setDocIdenti(String docIdenti) {
        this.docIdenti = docIdenti;
    }

    public List<AfiliadoCM> getAfiliados() {
        return afiliados;
    }

    public void setAfiliados(List<AfiliadoCM> afiliados) {
        this.afiliados = afiliados;
    }

    public String getIdAfiliado() {
        return idAfiliado;
    }

    public void setIdAfiliado(String idAfiliado) {
        this.idAfiliado = idAfiliado;
    }

    public AfiliadoDataModel getDataModel() {
        return dataModel;
    }

    public void setDataModel(AfiliadoDataModel dataModel) {
        this.dataModel = dataModel;
    }

    public AfiliadoCM getSelectedAfiliado() {
        return selectedAfiliado;
    }

    public void setSelectedAfiliado(AfiliadoCM selectedAfiliado) {
        this.selectedAfiliado = selectedAfiliado;
    }

    public boolean isVerPnlAfil() {
        return verPnlAfil;
    }

    public void setVerPnlAfil(boolean verPnlAfil) {
        this.verPnlAfil = verPnlAfil;
    }

    public boolean isVerTblAfil() {
        return verTblAfil;
    }

    public void setVerTblAfil(boolean verTblAfil) {
        this.verTblAfil = verTblAfil;
    }

    public Utils getUtils() {
        return utils;
    }

    public void setUtils(Utils utils) {
        this.utils = utils;
    }

    public AfiliacionBL getAfiliacionBL() {
        return afiliacionBL;
    }

    public void setAfiliacionBL(AfiliacionBL afiliacionBL) {
        this.afiliacionBL = afiliacionBL;
    }

    public boolean isVerTblAfils() {
        return verTblAfils;
    }

    public void setVerTblAfils(boolean verTblAfils) {
        this.verTblAfils = verTblAfils;
    }

    public List<AfiliacionCM> getAfiliaciones() {
        return afiliaciones;
    }

    public void setAfiliaciones(List<AfiliacionCM> afiliaciones) {
        this.afiliaciones = afiliaciones;
    }

    public String getIdAfiliacion() {
        return idAfiliacion;
    }

    public void setIdAfiliacion(String idAfiliacion) {
        this.idAfiliacion = idAfiliacion;
    }

    public AfiliacionDataModel getDataModelAfils() {
        return dataModelAfils;
    }

    public void setDataModelAfils(AfiliacionDataModel dataModelAfils) {
        this.dataModelAfils = dataModelAfils;
    }

    public AfiliacionCM getSelectedAfiliacion() {
        return selectedAfiliacion;
    }

    public void setSelectedAfiliacion(AfiliacionCM selectedAfiliacion) {
        this.selectedAfiliacion = selectedAfiliacion;
    }

    public List<CuentaCM> getCuentas() {
        return cuentas;
    }

    public void setCuentas(List<CuentaCM> cuentas) {
        this.cuentas = cuentas;
    }

    public CuentaDataModel getDataModelCuenta() {
        return dataModelCuenta;
    }

    public void setDataModelCuenta(CuentaDataModel dataModelCuenta) {
        this.dataModelCuenta = dataModelCuenta;
    }

    public CuentaCM getSelectedCuenta() {
        return selectedCuenta;
    }

    public void setSelectedCuenta(CuentaCM selectedCuenta) {
        this.selectedCuenta = selectedCuenta;
    }

    public String getIdCuenta() {
        return idCuenta;
    }

    public void setIdCuenta(String idCuenta) {
        this.idCuenta = idCuenta;
    }

    public String getServicio() {
        return idServicio;
    }

    public void setSuburb(String idServicio) {
        this.idServicio = idServicio;
    }

    public Map<String, String> getPlanes() {
        return planes;
    }

    public void setPlanes(Map<String, String> planes) {
        this.planes = planes;
    }

    public Map<String, String> getCategoria() {
        return categorias;
    }

    public void setCategoria(Map<String, String> categoria) {
        this.categorias = categoria;
    }

    public boolean isVerTblCuen() {
        return verTblCuen;
    }

    public void setVerTblCuen(boolean verTblCuen) {
        this.verTblCuen = verTblCuen;
    }

    public String getNroFactura() {
        return nroFactura;
    }

    public void setNroFactura(String nroFactura) {
        this.nroFactura = nroFactura;
    }

    public AfiliacionCM getSelectedAfiliadoT() {
        return selectedAfiliadoT;
    }

    public void setSelectedAfiliadoT(AfiliacionCM selectedAfiliadoT) {
        this.selectedAfiliadoT = selectedAfiliadoT;
    }

    public boolean isVerBtbNewAfils() {
        return verBtbNewAfils;
    }

    public void setVerBtbNewAfils(boolean verBtbNewAfils) {
        this.verBtbNewAfils = verBtbNewAfils;
    }

    public boolean isVerPlanCatego() {
        return verPlanCatego;
    }

    public void setVerPlanCatego(boolean verPlanCatego) {
        this.verPlanCatego = verPlanCatego;
    }
}
